package com.java.service.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import com.java.model.Student;
import com.java.service.StudentService;
import com.java.vo.Result;

/**
 * 使用Map实现学员存储
 */
public class StudentServiceMapImpl implements StudentService {
	
	public static Map<Integer, Student> stuMap = new HashMap<Integer, Student>();

	/**
	 * 新增一个学生
	 */
	public Result add(int id, String name, int age, double score) {
		Student student = new Student();
		student.setId(id);
		student.setAge(age);
		student.setName(name);
		student.setScore(score);
		return add(student);
	}
	
	/**
	 * 新增学生
	 */
	public Result add(Student student) {
		Result result = new Result();
		stuMap.put(student.getId(), student);
		return result.success("恭喜您，新增学员成功");
	}
	
	/**
	 * 修改指定学号学生的姓名
	 */
	public Result edit(int id, String name) {
		Student student = new Student();
		student.setId(id);
		student.setName(name);
		return edit(student);
	}
	
	/**
	 * 修改指定学号学生的成绩
	 */
	public Result edit(int id, double score) {
		Student student = new Student();
		student.setId(id);
		student.setScore(score);
		return edit(student);
	}
	
	/**
	 * 修改指定学号学生的所有信息
	 */
	public Result edit(Student student) {
		Result result = new Result();
		Student stu = find(student.getId());
		if (stu == null) {
			return result.fail("该学生不存在，不能进行编辑");
		} else {
			if (student.getAge() > 0) {
				stu.setAge(student.getAge());
			}
			if (student.getName() != null && !"".equals(student.getName())) {
				stu.setName(student.getName());
			}
			if (student.getScore() > 0) {
				stu.setScore(student.getScore());
			}
		}
		return result.success("恭喜你，编辑学员成功");
	}
	
	/**
	 * 删除指定ID的学生
	 */
	public Result delete(int id) {
		Result result = new Result();
		Student stu = find(id);
		if (stu != null) {
			stuMap.remove(id);
			return result.success("恭喜您，删除学员成功");
		} else {
			return result.fail("学员不存在");
		}
	}
	
	/**
	 * 查找指定ID的学生
	 * 
	 * @return Student | null
	 */
	public Student find(int id) {
		if (stuMap.isEmpty()) return null;
		return stuMap.get(id);
	}
	
	/**
	 * 打印所有学生信息
	 */
	public Collection<Student> listAll() {
		return stuMap.values();
	}
	
	/**
	 * 加载指定的文件
	 * 第一步：读取文件内容（一个一个的Student对象）
	 * 第二步：将Student放入Map里面
	 */
	public void load() {
		// 第一步：创建文件对象
		File file = new File("E:\\io\\students.bak");
		ObjectInputStream ois = null;
		// 判断是否存在，如果存在，则开始加载
		if (file.exists()) {
			try {
				// 第二步：创建对象输入流<-文件输入流<-文件
				ois = new ObjectInputStream(new FileInputStream(file));
				Object obj = null;
				// 第三步：调用对readObject方法进行对象读取
				// 如果结束不正确，会产生一个EOFException
				while ((obj = ois.readObject()) != null) {
					Student student = (Student) obj;
					add(student);
					// stuMap.put(student.getId(), student);
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 保存至文件
	 */
	public void save() {
		// 第一步：创建文件对象
		File file = new File("E:\\io\\students.bak");
		ObjectOutputStream oos = null;
		try {
			// 判断文件是否存在，如果不存在，则创建一个新的文件
			// TODO 添加对目录是否存在的操作
			if (!file.exists()) {
				file.createNewFile();
			}
			// 第二步：创建对象输出流->文件输出流->文件
			oos = new ObjectOutputStream(new FileOutputStream(file));
			
			
			// 第三步：写对象进输出流
			// a.迭代Map，将Student对象一个一个写入输出流
			for (Student student : listAll()) {
				oos.writeObject(student);
			}
			// b.将整个Map作为一个对象写入输出流
			// oos.writeObject(stuMap);
			
			// 附加：在写完所有业务对象之后，写入了一个空对象
			oos.writeObject(null);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (oos != null)
					oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
}
